-- msg_add_dungeon
-- Create by panyl
-- 增加地牢数据

return function(lpc)
    local data = lpc.data;
    local dungeonId = lpc.dungeon_id;

    trace("msg_add_dungeon", "缓存地牢数据");

    -- 先取出来
    local dungeon = DungeonM.getDungeonContainer();

    -- 备份的迷宫数据
    local dungeonBak = ME.user.dbase:query("dungeon_bak");

    -- 有应答了
    if lpc.auth_id >= 0 then
        DungeonServiceM.clearQueue(lpc.auth_id);
    end

    if dungeon.dungeonId ~= dungeonId then
        trace("msg_add_dungeon", "不是当前所在的地牢数据。");
        return;
    end

    -- 对每一层的地牢数据解析出来
    for layer, elements in pairs(data) do
        -- 某层的格子元素数据，应该是{ { class1 : element1, }, ... {class30 : element30 }, keyPos, }这样的格式

        -- 最后一个是钥匙
        dungeon.keyPos[layer] = elements[#elements] + 1;
        elements[#elements] = nil;

        dungeon.combats[layer] = elements;

        -- 如果有备份的数据，也往备份数据上保存一份
        if dungeonBak and dungeonBak.combats then
            dungeonBak.combats[layer] = elements;

            dungeonBak.keyPos[layer] = dungeon.keyPos[layer];
        end

        -- 统计格子(缓存层的)
        DungeonStatM.doLayerStat(layer, elements);
    end

    -- 更新地牢数据
    DungeonM.updateDungeonInfo(dungeon);

    if DungeonM.getState() == DUNGEON_WAIT_NEXT then
        DungeonM.nextFloor();
    end
end
